/*
 * Copyright (C), 2002-2014, 南京迪威视讯科技有限公司
 * FileName: DistanceUtil.java
 * Author:   Administrator
 * Date:     2014年9月2日 下午4:28:24
 * Description: //模块目的、功能描述      
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
package com.code.platform.common.utils;

import java.math.BigDecimal;

/**
 * 根据经纬度计算距离<br> 
 * 〈功能详细描述〉
 *
 * @author Administrator
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class DistanceUtil {
    /**
     * 地球半径 （千米）
     */
    private static final double EARTH_RADIUS = 6378.137;
    
    /**
     * 功能描述: <br>
     * 〈功能详细描述〉
     *
     * @param d
     * @return
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    private static double rad(double d)
    {
       return d * Math.PI / 180.0;
    }

    /**
     * 功能描述: 计算距离<br>
     * 〈功能详细描述〉
     *
     * @param lat1 地点1所在纬度
     * @param lng1 地点1所在经度
     * @param lat2 地点2所在纬度
     * @param lng2 地点2所在经度
     * @return 距离（千米）
     * @see [相关类/方法](可选)
     * @since [产品/模块版本](可选)
     */
    public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
    {
       double radLat1 = rad(lat1);
       double radLat2 = rad(lat2);
       double a = radLat1 - radLat2;
       double b = rad(lng1) - rad(lng2);
       double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + 
        Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
       s = s * EARTH_RADIUS;
       BigDecimal bd = new BigDecimal(s);
       bd = bd.setScale(1, BigDecimal.ROUND_HALF_UP);
       return bd.doubleValue() * 1000;
    }
    
    public static void main(String[] args) {
        System.out.println(GetDistance(32.0488170000, 118.7826340000, 32.0485720000, 118.7911410000));
        System.out.println(GetDistance(32.0677440000, 118.7912490000, 32.0485720000, 118.7911410000));
    }
}
